package Controller;
// Implem d'une class singleton  ? class statique ? TODO

import java.awt.*;

import Model.*;
import View.*;


import Model.Construction.*;


/**
 * La class Curseur contient la selection faite par la souris sur le
 * panneau de gauche, pour ensuite les appliquer sur le terrain
 *
 * @author MAADJO
 */

public class Curseur {

	String infra;  // infrastructure courante à construire
	Infrastructure dummy; //dummy object pour recup la taille

	private EcouteurDeBoard eboard;
	private EcouteurDeBoutonAMenu ebam;
	private InfrastructureFactory infraFac;
	//	private EcouteurDeBoutonSuppr esupp;

	//objets externes
	private Fenetre fenetre;
	private Board board;
	private Ville ville;
	private CurseurPanel curseurpanel;

	public Curseur(Ville v, Fenetre f) {
		fenetre = f;
		ville = v;

		curseurpanel = fenetre.getLeftPanel().getCurseurPanel();
		curseurpanel.setCurseur(this);

		infraFac = new InfrastructureFactory(ville);
		eboard = new EcouteurDeBoard(f.getBoardPanel(), this);
		ebam = new EcouteurDeBoutonAMenu(f.getLeftPanel(), this);
	}

	public void setInfra(String s) {
		infra =  s;
		if (!  s.equals(".Destruction"))
			dummy =(Infrastructure) infraFac.construire(infra);
		//on notifie la vue du type de batiment choisi;
		fenetre.getBoardPanel().setInfra(s);
	}

	public String getInfra() {
		return infra;
	}


	public Board getBoard() {
		return ville.getBoard();
	}


	public Infrastructure getDummy() {
		return dummy;
	}

	public Ville getVille() {
		return ville;
	}

	/** Construit une ou plusieur batiment sur la surface demande
	 * @param SupG Angle superieur gauche de la surface
	 * @param InfD Angle inferieur droit de la surface
	 */
	public void construction(Point SupG, Point InfD) {
		Infrastructure inf=null;
		inf = (Infrastructure) infraFac.construire(infra);
		for(int x=SupG.x; x<=InfD.x;) {
			for(int y=SupG.y; y<=InfD.y;) {
				construction(x,y);

				y += inf.getHauteur();
			}
			x += inf.getLargeur();
		}
	}

	/** Se charge de verifier si on peut construire le batiment (si batiment simple)
	 * Si c'est possible, on demande a la fabrique de le construire
	 * Puis batiment est inseré dans le jeu par la class ville
	 * @param x positionX
	 * @param y positionY
	 */

	public void construction(int x, int y) {
		Object o = null;
		if(ville.getBoard().getObject(y,x) == null) {
			Infrastructure inf = infraFac.construire(infra);
			ville.construction(x,y, inf);
		}
	}

	/** Se charge de verifier s'il y a un batiment a detruire, puis demande
	 * sa destruction à la classe ville
	 *
	 * @param x positionX
	 * @param y positionY
	 */
	public void destruction(int x, int y) {
		if(ville.getBoard().getObject(y,x) != null) {
			ville.destruction(x,y);
		} else {
			System.out.println("YA rien à detruire");
		}
	}
}

